#include <REGX51.H>
#include <absacc.h>
#include <definicje.h>
#include <prototypy.h>
extern xdata 	byte zaszyfrowane[2048];
extern data  	byte klucz[8];
extern data  	byte klucz2[8];
extern data  	byte bufor[16];
extern data		byte rozmiar[4];
extern data  	byte pobrane;
extern data		int zapisane;
extern bdata  	bit klucz_wczytany;
extern bdata  	bit koniec_transmisji;

	  

void alg_Xor(void)	//OK
{
	byte i=0;
	while(i!=8)
	{
		bufor[i]   ^= klucz[i];
		bufor[i+8] ^= klucz2[i];
		i++;
	}
}

void alg_Xnor(void)	  //OK
{
	byte i=0;
	while(i!=8)
	{
		bufor[i] = ~(bufor[i]^klucz[i]);
		bufor[i+8] = ~(bufor[i+8]^klucz2[i]);
		i++;
	}
}

void alg_Bsr(void)
{
	data byte temp[16], przesuniecie_k, przesuniecie_b=0, i=0;
	bdata bit c1, c2;


	//ustalamy o ile komorek i ile bitow nalezy przesunac bufor
	while(i!=8)
	{
		przesuniecie_b += klucz[i];
		i++;
	}
	przesuniecie_k =  (przesuniecie_b>>3) & 0x07;
	przesuniecie_b &= 0x07;
	


	//przesuwamy komorki
	i=0;
	while(i!=16)
	{
		temp[przesuniecie_k]=bufor[i];
		przesuniecie_k = (przesuniecie_k + 1)&0x0F;
		i++;
	}
	

	

	//przesuwamy bity
	//1. bierzemy najmlodszy bit bajtu 15 do C2
	//2. petla:
	//	-najmlodszy bit bajtu 1 -> C1
	//	-bajt1 >> 1
	//	-najstarszy bit bajtu 1 <- C2
	//	-C2=C1	
	while(przesuniecie_b!=0)
	{
		i=0;
		c2=(temp[15]&0x01)==1;
		while(i!=16)
		{
			c1=(temp[i]&0x01)==1;
			temp[i]>>=1;
			if(c2) temp[i] |= 0x80;
			c2=c1;
			i++;			
		}
		przesuniecie_b--;
	}
	i=0;
	while(i!=16)
	{
		bufor[i]=temp[i];
		i++;
	}					
}


void alg_Bsl(void)
{
	data byte temp[16], przesuniecie_k, przesuniecie_b=0, i=0;
	bdata bit c1, c2;


	//ustalamy o ile komorek i ile bitow nalezy przesunac bufor
	while(i!=8)
	{
		przesuniecie_b += klucz[i];
		i++;
	}
	przesuniecie_k =  (przesuniecie_b>>3) & 0x07;
	przesuniecie_b &= 0x07;
	


	//przesuwamy komorki
	i=0;
	while(i!=16)
	{
		temp[i]=bufor[przesuniecie_k];
		przesuniecie_k = (przesuniecie_k + 1)&0x0F;
		i++;
	}
	

	

	//przesuwamy bity
	//1. bierzemy najstarszy bit bajtu 1 do C2
	//2. petla:
	//	-najstarszy bit bajtu 15 -> C1
	//	-bajt1 << 1
	//	-najmlodszy bit bajtu 15 <- C2
	//	-C2=C1	
	while(przesuniecie_b!=0)
	{
		i=16;
		c2=(temp[0]&0x80)==0x80;
		while(i!=0)
		{
			i--;
			c1=(temp[i]&0x80)==0x80;
			temp[i]<<=1;
			if(c2) temp[i] |= 0x01;
			c2=c1;			
		}
		przesuniecie_b--;
	}
	i=0;
	while(i!=16)
	{
		bufor[i]=temp[i];
		i++;
	}
}




byte ZamienParyZwrocOperacje(byte para)
{
	#define offset para
	byte operacja, komorka, maska;
	komorka=(para>>2)&0x07; //OK
	offset = (3-(para&0x03))<<1;		  //odstep od prawej
	maska=~(0x03<<offset); //zera tam gdzie para
	operacja = (klucz[komorka]>>offset)&0x03;
	klucz[komorka]=(klucz[komorka]&maska)|(klucz2[komorka]&(~maska));
	klucz2[komorka]=(klucz2[komorka]&maska)|(operacja<<offset);
	return operacja;
	#undef offset		
}